////1、喝汽水问题，一块钱一瓶汽水，两个空瓶换一瓶汽水，20元能喝多少瓶？
//
//#include<stdio.h>
//int main(){
//    int p=1,n=0,empty=0,sum=0;
//    scanf("%d",&n);
//    empty=n/p;
//    sum=n/p;//买回来的汽水喝掉
//    while(empty>=2){//空瓶大于等于2，别看错了
//        sum+=empty/2;//有一个+=，说明+=后的值是要加进去的，不需要在后面继续赋值
//        empty=empty%2+empty/2;//计算总数，不能只加多余的空瓶
//    }
//    printf("%d",sum);
//    return 0;
//}




////解法2:数据规律
//int main(){
//    int p=1,n=0,empty=0,sum=0;
//    scanf("%d",&n);
//    if(n==0)
//        sum=0;
//    else
//        sum=2*n-1;}




////2、谁是凶手
//A:不是我
//B:是C
//C:是D
//D:C说的是假话
//3个人说真话，1个说假话，写程序判断谁是凶手
//#include<stdio.h>
//int main(){
//    int killer=0;//int也可保存字符
//    for(killer='a';killer<='d';killer++){
//        if((killer!='a')+(killer=='c')+(killer=='d')+(killer!='d')==3){
//            printf("%c",killer);
//        }
//    }
//    return 0;
//}




////3、字符串左旋，ABCD->CDAB，左旋两位，ABCD->BCDA，这是左旋一位
//字母左旋:
//#include<stdio.h>
//#include <string.h>
//#include <assert.h>
//void left_move(char*arr,int len,int k){
//    int i=0;
//    assert(arr!=NULL);//不为空指针，非0，
//    for(i=0;i<k;i++){
//        int j=0;
//        char temp=*arr;//第一步，先挪走第一位，倘若第一步和第二步不分开（都放到循环中），会导致左旋的字符发生变化
//        for(j=0;j<len-1;j++){ //如果是右旋的话就是--，len-1是因为少一位(毕竟是从0开始算的)
//            *(arr+j)=*(arr+j+1);//第二步，把剩下的往前挪
//        }
//        *(arr+len-1)=temp;//三步分开，第三步，把第一位放到最后一位，倘若第二步和第三步不分开，会导致最后一位被多次赋值
//                            //例如ABCDEF时，会将A赋值到最后一位F，导致F丢失
//    }
//}
//int main(){
//    char arr[]={"abcdef"};
//    int len=(int)strlen(arr);//注意这里需要转换
//    int k=2;
//    left_move(arr,len,k);
//    printf("%s",arr);
//    return 0;
//}




////字母右旋,位数不定:
//#include<stdio.h>
//#include <string.h>
//#include <assert.h>
//
//void right_move(char*arr,int len,int k){
//    int i=0;
//    assert(arr!=NULL);
//    for(i=0;i<k;i++){
//        char temp=*(arr+len-1);
//        int j=0;
//        for(j=len-1;j>0;j--){//注意这里是右旋,所以从高到低应为--
//            *(arr+j)=*(arr+j-1);//这时候j已经是最大值了，所以不能写j+1
//        }
//        *arr=temp;
//    }
//}
//int main(){
//    char arr[]={"abcdef"};
//    int len=strlen(arr);
//    int k=2;
//    right_move(arr,len,k);
//    printf("%s",arr);
//    return 0;
//}




////字母左旋，三步翻转法:
//#include<stdio.h>
//#include <string.h>
//#include <assert.h>
//void reverse(char*left,char*right){
//    assert(left!=0);
//    assert(right!=0);
//    char temp=0;
//    while(left<right){
//        temp=*left;
//        *left=*right;
//        *right=temp;
//        left++;
//        right--;//别忘了设置循环终止条件
//    }
//
//}
//void left_move(char*arr,int len,int k){
//    reverse(arr,arr+k-1);
//    reverse(arr+k,arr+len-1);
//    reverse(arr,arr+len-1);
//}
//int main(){
//    char arr[]={"abcdef"};
//    assert(arr);
//    int len=strlen(arr),k=2;
//    assert(k<=len);//左旋字符数不能超过总字符数
//    left_move(arr,len,k);
//    printf("%s",arr);
//    return 0;
//}




////字母右旋，三步翻转法:
//#include<stdio.h>
//#include <string.h>
//#include <assert.h>
//void reverse(char*left,char*right){
//    assert(left!=0);
//    assert(right!=0);
//    char temp=0;
//    while(left<right){
//        temp=*left;
//        *left=*right;
//        *right=temp;
//        left++;
//        right--;
//    }
//}
//void right_move(char*arr,int len,int k){
//    assert(arr!=NULL);
//    reverse(arr+len-k,arr+len-1);//左边不是在右边的基础上增减,而是整体上看
//    reverse(arr,arr+len-k-1);
//    reverse(arr,arr+len-1);
//}
//int main(){
//    char arr[]={"abcdef"};
//    int len=strlen(arr);
//    int k=2;
//    right_move(arr,len,k);
//    printf("%s",arr);
//    return 0;
//}




////1.检查是否为左旋字符:(追加assert
//#include<stdio.h>
//#include <string.h>
//#include<assert.h>
//void reverse(char*left,char*right){
//    assert(left!=0);
//    assert(right!=0);
//    while(left<right){
//        char temp=*left;
//        *left=*right;
//        *right=temp;
//        left++;
//        right--;
//    }
//}
//void left_move(char*arr1,int len,int i){
//    reverse(arr1,arr1+i-1);//把要左旋的先逆置
//    reverse(arr1+i,arr1+len-1);//把剩下的逆置
//    reverse(arr1,arr1+len-1);//逆置所有
//
//}
//int is_left_move(char*arr1,char*arr2,int len){
//    int i=0;
//    for(i=1;i<=len;i++) {
//        left_move(arr1,len,1);//如果i跟着变的话，第一次左旋一个字符，第二次要在已经左旋
//                              // 了一个字符的基础上左旋两个字符，无法达到一个一个左旋的效果
//        if (strcmp(arr1,arr2)==0) {//字符数组要用strcmp，不能直接比较
//            return 1;
//        }
//    }
//    return 0;
//}
//int main(){
//    char arr1[]={"abcdef"};//注意定义字符数组要有框
//    char arr2[]={"cdefab"};
//      assert(arr1);
//      assert(arr2);
//    int len=strlen(arr1);
//      assert(len1==len2);
//    int ret=is_left_move(arr1,arr2,len);
//    if(ret==1){
//        printf("Yes");
//    }
//    else{
//        printf("No");
//    }
//    return 0;
//}




////2、另一种方法检查arr2是否由arr1左旋得来
//#include<stdio.h>
//#include <string.h>
//
//int is_left_move(char*arr1,char*arr2){
//    int len1=strlen(arr1);
//    int len2=strlen(arr2);
//    if(len1!=len2){
//        return 0;
//    }
//    strncat(arr1,arr1,6);//在arr1的末尾追加6位的arr1
//    int ret=strstr(arr1,arr2);//如果改变后的arr1里没有子串arr2返回NULL
//    if(ret==NULL){
//        return 0;
//    }
//    else{
//        return 1;
//    }
//}
//int main(){
//    char arr1[]={"abcdef"};
//    char arr2[]={"cdefab"};
//    int ret=is_left_move(arr1,arr2);
//    if(ret==1){
//        printf("Yes");
//    }
//    else{
//        printf("No");
//    }
//    return 0;
//}



////检查是否为右旋字符(方法1:
//#include<stdio.h>
//#include <assert.h>
//#include <string.h>
//void right_move(char*arr1,int len1,int k){
//    char temp=0;
//    int i=0;
//    for(i=0;i<k;i++){
//        temp=*(arr1+len1-1);
//        int j=0;
//        for(j=len1-1;j>0;j--){//注意这里是递减
//            *(arr1+j)=*(arr1+j-1);
//        }
//        *arr1=temp;
//    }
//}
//int is_right_move(char*arr1,char*arr2,int len1){
//    assert(arr1);
//    assert(arr2);
//    int i=0;
//    for(i=0;i<len1;i++){
//        right_move(arr1,len1,1);
//        if(strcmp(arr1,arr2)==0){//别忘了字符串比较只能用strcmp函数
//            return 1;
//        }
//    }
//    return 0;
//}
//int main(){
//    char arr1[]={"abcdef"};
//    char arr2[]={"efabcd"};
//    int len1=strlen(arr1);
//    int len2=strlen(arr2);
//    assert(len1==len2);
//    int ret=is_right_move(arr1,arr2,len1);
//    if(ret==1){
//        printf("Yes");
//    }
//    else{
//        printf("No");
//    }
//    return 0;
//}




////检查右旋,方法二:
//#include<stdio.h>
//#include <string.h>
//#include <assert.h>
//void reverse(char*left,char*right){
//    while(left<right){
//        char temp=*right;
//        *right=*left;
//        *left=temp;
//        left++;
//        right--;
//    }
//}
//void right_move(char*arr1,int len1,int k){
//    reverse(arr1+len1-1-k,arr1+len1-1);//想左旋就先反转左边的,右旋就先反转右边的
//    reverse(arr1,arr1+len1-k-2);
//    reverse(arr1,arr1+len1-1);
//}
//int is_right_move(char*arr1,char*arr2,int len1){
//    assert(arr1);
//    assert(arr2);
//    int i=0;
//    for(i=0;i<len1;i++){
//        right_move(arr1,len1,1);
//        if(strcmp(arr1,arr2)==0){
//            return 1;
//        }
//    }
//    return 0;
//}
//int main(){
//    char arr1[]="abcdef";
//    char arr2[]="efabcd";
//    int len1=strlen(arr1);
//    int len2=strlen(arr2);
//    assert(len1==len2);
//    int ret=is_right_move(arr1,arr2,len1);
//    if(ret==1){
//        printf("Yes");
//    }
//    else{
//        printf("No");
//    }
//    return 0;
//}




////检查右旋,方法三(检查所有左旋右旋,实际上右旋也是左旋,是左旋len1-k个,k为右旋个数:
//#include<stdio.h>
//#include <string.h>
//#include <assert.h>
//int is_right_move(char*arr1,char*arr2,int len1){
//    assert(arr1);
//    assert(arr2);
//    strncat(arr1,arr1,6);
//    int ret=strstr(arr1,arr2);
//    if(ret==NULL){
//        return 0;
//    }
//    else{
//        return 1;
//    }
//}
//int main(){
//    char arr1[]="abcdef";
//    char arr2[]="efabcd";
//    int len1=strlen(arr1);
//    int len2=strlen(arr2);
//    assert(len1==len2);
//    int ret=is_right_move(arr1,arr2,len1);
//    if(ret==1){
//        printf("Yes");
//    }
//    else{
//        printf("No");
//    }
//    return 0;
//}